package com.rlz.base.tools.expand

import android.annotation.SuppressLint
import android.app.Activity
import android.content.Context
import android.net.ConnectivityManager
import android.net.NetworkInfo
import androidx.core.content.ContextCompat
import androidx.fragment.app.Fragment
import com.rlz.base.app.Base


/**
 * Created by RLZ
 * on 2021/4/15
 *
 * 关于Context的扩展函数 发挥想象力 随意添加
 *
 * 关于inline 关键字的解释:
 * lambda表達式会被编译成匿名类使用 如果在短时间内这个表达式被多次调用的话
 * 大量的对象实例化就会产生内存流失Memory Churn
 *
 * inline 关键字应该只用在需要内联特性的函数中，比如高阶函数作为参数和具体化的类型参数时
 *
 * 注意:过度使用 inline 可能会妨碍或停止 Hotspot 优化（例如方法内联）。
 * 默认情况下， Hotspot 不会内联大于35个字节的方法
 *
 */


@Suppress("DEPRECATION")
@SuppressLint("MissingPermission")
fun Context.isConnectedNetwork(): Boolean = run {
    val conn = getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
    val activeNetwork: NetworkInfo? = conn.activeNetworkInfo
    activeNetwork?.isConnectedOrConnecting == true
}


inline fun <reified T : Any> Activity.getValue(
        label: String, defaultValue: T? = null) = lazy {
    val value = intent?.extras?.get(label)
    if (value is T) value else defaultValue
}

inline fun <reified T : Any> Activity.getValueNonNull(
        label: String, defaultValue: T? = null) = lazy {
    val value = intent?.extras?.get(label)
    requireNotNull((if (value is T) value else defaultValue)) { label }
}

inline fun <reified T : Any> Fragment.getValue(label: String, defaultValue: T? = null) = lazy {
    val value = arguments?.get(label)
    if (value is T) value else defaultValue
}

inline fun <reified T : Any> Fragment.getValueNonNull(label: String, defaultValue: T? = null) = lazy {
    val value = arguments?.get(label)
    requireNotNull(if (value is T) value else defaultValue) { label }
}

fun Int.asColor() = ContextCompat.getColor(Base.obtain(), this)

fun Int.asDrawable() = ContextCompat.getDrawable(Base.obtain(), this)